# FilteringIterator.java

    package org.codefilarete.tool.collection;

    import java.util.Iterator;
    import java.util.NoSuchElementException;
    import java.util.function.Predicate;

    /**
     * @author Guillaume Mary
     */
    public class FilteringIterator<T> implements Iterator<T> {

    	private final Iterator<T> delegate;
    	private final Predicate<T> acceptFilter;
    	private T lookAhead;
    	private boolean hasMatcher;

    	public FilteringIterator(Iterator<T> delegate, Predicate<T> acceptFilter) {
    		this.delegate = delegate;
    		this.acceptFilter = acceptFilter;
    	}

    	@Override
    	public boolean hasNext() {
    		consumeDelegateUntilMatch();
    		return hasMatcher;
    	}

    	private void consumeDelegateUntilMatch() {
    		while (!hasMatcher && delegate.hasNext()) {
    			lookAhead = delegate.next();
    			if (acceptFilter.test(lookAhead)) {
    				hasMatcher = true;
    			}
    		}
    	}

    	@Override
    	public T next() {
    		if (!hasMatcher) {
    			throw new NoSuchElementException();
    		}
    		hasMatcher = false;
    		return lookAhead;
    	}

    	@Override
    	public void remove() {
    		delegate.remove();
    	}
    }